import {
    tap,
    map,
    catchError,
    delay,
    timeout
} from 'rxjs/operators';
import {
    of,
    throwError
} from "rxjs";

// 管道操作符
// pipe也是一核心概念，用于将多个操作符组合在一起，形成一个管道pipeline
// 通过这个管道，可以对Observable对象发出的数据进行转换和操作
// pipe是Observable实例上的一个方法，他接受多个操作符作为参数，返回一个新的Observable

// 1.tap 是一个操作符，用于对Observable对象发出的值进行执行副作用操作，比如记录日志，它不会改变数据流中的值

of(1, 2, 3)
    .pipe(
        tap((val) => {
            console.log('pipe-tap', val)
        })
    )
    .subscribe((val) => {
        console.log('subscribe', val)
    })

console.log('-------------------------------------')

// 2. map是一个操作符，用于对Observable发出的值进项转换/映射
of(1, 2, 3).pipe(
    map((val) => {
        return val * 10
    })
).subscribe((val) => {
    console.log('subscribe', val)
})


console.log('-------------------------------------')
// 3. catchError 用于捕获Observable中的错误，并返回一个新的Observable
const observable = throwError(() => {
    return new Error('throwError message')
})
observable.pipe(
    catchError((err) => {
        // of返回新的 Observable
        return of('Caught：' + err.message)
    })
).subscribe((val)=>{
    console.log('subscribe',val)
});

console.log('-------------------------------------')

// 4. timeout 对Observable增加超时限制，如果刀了指定时间还没发出值，则抛出错误
// delay 暂停一段时间再发出值
of('hello').pipe(
    delay(2000),
    timeout(1000)
).subscribe({
    error:err=>{
        console.log(err.message)
    }
})
